#ifndef SCRIPT_TASK_OBJECT_POOL_H
#define SCRIPT_TASK_OBJECT_POOL_H

#include <optional>
#include <global.h>
#include "task/abstract_task.h"
#include "scheduler/abstract_scheduler.h"

namespace script
{
class ScriptTaskObjectPoolData;

/**
 * @brief:  脚本里面的创建的对象管理
 * @author: sherlock_lht
 */
class ScriptTaskObjectPool: public std::enable_shared_from_this<ScriptTaskObjectPool>
{
public:
    explicit ScriptTaskObjectPool();
    ~ScriptTaskObjectPool();

    /**
     * @brief:  指定的任务变量对象是否已经创建
     * @author: sherlock_lht
     */
    bool isObjectCreate(const std::string &task_variable);

    /**
     * @brief:  创建task对象
     * @param:  task_variable   task对象变量
     * @param:  task_type       task类型
     * @param:  task_name       task创建时，传递给构造函数的name
     * @author: sherlock_lht
     */
    bool createObject(const std::string &task_variable, const std::string &task_type, const std::string &task_name);

    /**
     * @brief:  指定的函数变量对象是否已经创建
     * @author: sherlock_lht
     */
    bool isFunctionCreate(const std::string &function_variable);

    /**
     * @brief:  创建函数对象
     * @author: sherlock_lht
     */
    bool createFunction(const std::string &function_name, scheduler::AbstractSchedulerConstPtr &scheduler);

    /**
     * @brief:  获取task对象
     * @author: sherlock_lht
     */
    std::optional<task::AbstractTaskConstPtr> getTaskObject(const std::string &task_variable);

    /**
     * @brief:  获取函数定义对象
     * @author: sherlock_lht
     */
    std::optional<scheduler::AbstractSchedulerConstPtr> getFunctionObject(const std::string &function_variable);

    /**
     * @brief:  获取最近一次接口调用的错误信息，如果没有错误，则返回空字符串
     * @author: sherlock_lht
     */
    std::string getLastErrorMessage() const;

    std::shared_ptr<ScriptTaskObjectPool> getTaskPoolPtr();

private:
    DECLARE_DATA(ScriptTaskObjectPool)
};

}

#endif //SCRIPT_TASK_OBJECT_POOL_H
